package io.github.frailty9.crserver.config

import cn.dev33.satoken.dao.SaTokenDao
import cn.dev33.satoken.dao.SaTokenDaoForRedisson
import mu.KotlinLogging
import org.noear.solon.Solon
import org.noear.solon.annotation.Bean
import org.noear.solon.annotation.Configuration
import org.noear.solon.annotation.Inject
import org.noear.solon.cache.redisson.RedissonCacheService
import org.noear.solon.cache.redisson.RedissonClientOriginalSupplier
import org.noear.solon.data.cache.CacheService
import org.redisson.api.RedissonClient
import org.redisson.Redisson
import kotlin.system.exitProcess

/**
 * Redis 配置
 *
 * 使用客户端为 [Redisson]
 */
@Configuration
class RedisConfig {
    val log = KotlinLogging.logger {  }

    // 创建 RedissonClient（复用）
    @Bean
    fun redissonClient(
        @Inject("\${cr.redis}")
        supplier: RedissonClientOriginalSupplier
    ): RedissonClient {
        try {
            return supplier.get()
        } catch (e: Exception) {
            log.error("Redis服务连接失败, 请检查服务状态或连接配置")
            Solon.stop()
            exitProcess(1)
        }
    }

    // 提供 CacheService（用于 @Cache 注解等）
    @Bean
    fun cacheService(redissonClient: RedissonClient): CacheService {
        return RedissonCacheService(redissonClient, 1800) // 默认缓存30分钟
    }

    // 提供 SaTokenDao（Sa-Token 会话存储）
    @Bean
    fun saTokenDao(redissonClient: RedissonClient): SaTokenDao {
        return SaTokenDaoForRedisson(redissonClient)
    }
}
